using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._AviationTools._Airports._ObstructionIdentificationSurfaces
{
    /// <summary>
    /// <para>PAPI Obstacle Clearance Surface</para>
    /// <para>Creates a Precision Approach Path Indicator (PAPI) Obstacle Clearance Surface (OCS) based on the FAA Engineering Brief (EB) 95.</para>
    /// <para>根据 FAA 工程简报 （EB） 95 创建精确进近路径指示器 （PAPI） 障碍物间隙表面 （OCS）。</para>
    /// </summary>    
    [DisplayName("PAPI Obstacle Clearance Surface")]
    public class PAPIObstacleClearanceSurface : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public PAPIObstacleClearanceSurface()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_features">
        /// <para>Input Runway Features</para>
        /// <para>The input runway dataset. The feature class must be z-enabled and contain polylines.</para>
        /// <para>输入跑道数据集。要素类必须启用 z 并包含折线。</para>
        /// </param>
        /// <param name="_target">
        /// <para>Target OIS Features</para>
        /// <para>The target feature class that will contain the generated obstruction identification surfaces.</para>
        /// <para>将包含生成的障碍物识别表面的目标要素类。</para>
        /// </param>
        public PAPIObstacleClearanceSurface(object _in_features, object _target)
        {
            this._in_features = _in_features;
            this._target = _target;
        }
        public override string ToolboxName => "Aviation Tools";

        public override string ToolName => "PAPI Obstacle Clearance Surface";

        public override string CallName => "aviation.PAPIObstacleClearanceSurface";

        public override List<string> AcceptEnvironments => [];

        public override object[] ParameterInfo => [_in_features, _target, _runway_direction.GetGPValue(), _length, _divergence, _slope, _distance_from_threshold, _start_height, _derived_outfeatureclass, _airport_control_point_feature_class];

        /// <summary>
        /// <para>Input Runway Features</para>
        /// <para>The input runway dataset. The feature class must be z-enabled and contain polylines.</para>
        /// <para>输入跑道数据集。要素类必须启用 z 并包含折线。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Runway Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_features { get; set; }


        /// <summary>
        /// <para>Target OIS Features</para>
        /// <para>The target feature class that will contain the generated obstruction identification surfaces.</para>
        /// <para>将包含生成的障碍物识别表面的目标要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Target OIS Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _target { get; set; }


        /// <summary>
        /// <para>Runway Direction</para>
        /// <para><xdoc>
        ///   <para>Specifies the end of the runway where the approach surface will be created.</para>
        ///   <bulletList>
        ///     <bullet_item>High Runway End Designator— The approach surface will be created at the high end of the runway. This is the default</bullet_item><para/>
        ///     <bullet_item>Low Runway End Designator—The approach surface will be created at the low end of the runway.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定将在其中创建进近面的跑道尽头。</para>
        ///   <bulletList>
        ///     <bullet_item>高跑道末端指示符 — 进近面将在跑道的高端创建。这是默认设置</bullet_item><para/>
        ///     <bullet_item>低跑道末端指示符 - 进近面将在跑道的低端创建。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Runway Direction")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _runway_direction_value _runway_direction { get; set; } = _runway_direction_value._HIGH_RUNWAY_END_DESIGNATOR;

        public enum _runway_direction_value
        {
            /// <summary>
            /// <para>High Runway End Designator</para>
            /// <para>High Runway End Designator— The approach surface will be created at the high end of the runway. This is the default</para>
            /// <para>高跑道末端指示符 — 进近面将在跑道的高端创建。这是默认设置</para>
            /// </summary>
            [Description("High Runway End Designator")]
            [GPEnumValue("HIGH_RUNWAY_END_DESIGNATOR")]
            _HIGH_RUNWAY_END_DESIGNATOR,

            /// <summary>
            /// <para>Low Runway End Designator</para>
            /// <para>Low Runway End Designator—The approach surface will be created at the low end of the runway.</para>
            /// <para>低跑道末端指示符 - 进近面将在跑道的低端创建。</para>
            /// </summary>
            [Description("Low Runway End Designator")]
            [GPEnumValue("LOW_RUNWAY_END_DESIGNATOR")]
            _LOW_RUNWAY_END_DESIGNATOR,

        }

        /// <summary>
        /// <para>Length</para>
        /// <para>The length of the surface in miles. The default value is 4.</para>
        /// <para>表面的长度（以英里为单位）。默认值为 4。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Length")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _length { get; set; } = 4;


        /// <summary>
        /// <para>Divergence</para>
        /// <para>The divergence of the surface in degrees. The default value is 10.</para>
        /// <para>表面的发散度（以度为单位）。默认值为 10。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Divergence")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _divergence { get; set; } = 10;


        /// <summary>
        /// <para>Slope</para>
        /// <para>The slope of the surface in degrees. The default value is 3.</para>
        /// <para>曲面的坡度（以度为单位）。默认值为 3。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Slope")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _slope { get; set; } = 3;


        /// <summary>
        /// <para>Distance From Threshold</para>
        /// <para>The distance from the threshold in feet. The default value is 700.</para>
        /// <para>与阈值的距离（以英尺为单位）。默认值为 700。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Distance From Threshold")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _distance_from_threshold { get; set; } = 700;


        /// <summary>
        /// <para>Start Height</para>
        /// <para>The start height of the surface in feet. The default value is 35.</para>
        /// <para>曲面的起始高度（以英尺为单位）。默认值为 35。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Start Height")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _start_height { get; set; } = 35;


        /// <summary>
        /// <para>Output OIS Features</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output OIS Features")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public object _derived_outfeatureclass { get; set; }


        /// <summary>
        /// <para>Input Airport Control Point Feature</para>
        /// <para>Supplies x-, y-, and z-geometry for displaced threshold features. If displaced thresholds are included, surfaces will be constructed based on their x-, y-, and z-geometry instead of their corresponding runway feature endpoint.</para>
        /// <para>为位移阈值特征提供 x、y 和 z 几何。如果包含位移阈值，则将基于其 x、y 和 z 几何构建表面，而不是其相应的跑道要素端点。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Airport Control Point Feature")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _airport_control_point_feature_class { get; set; } = null;


        public PAPIObstacleClearanceSurface SetEnv()
        {
            base.SetEnv();
            return this;
        }

    }

}